Skip to content
GitHub

Go File IO

golang 通过 os 对文件读写 io/ioutil 读写文件调用的是 os 的方法


import {
    . "fmt"
    "io"
    "bufio"
}

func read(fileName string) string {                                  // 快速读取文件全部内容
    content, err := os.ReadFile(fileName)
    if  err != nil {
        panic(Sprintf("read %s failed: %s", fileName, err))
    }
    return string(content)
}

func readLine(fileName string) []string {                            // 逐行读取文件, 返回字符串切片, 切片元素结尾无换行符号
    file, err := os.OpenFile(fileName, os.O_RDONLY|os.O_CREATE, 0666)
    if err != nil {
        panic("read file error: ", err)
    }
    defer file.Close()

    buf := bufio.NewReader(file)
    content := []string{}
    for {
        line, _, err := buf.ReadLine()
        if err == io.EOF {
            break
        }
        content = append(content, string(line))
    }
    return content
}

func readByte(fileName string, length int) string {                  // 每次读取固定长度字符串
    file, err := os.OpenFile(fileName, os.O_RDONLY|os.O_CREATE, 0666)
    if err != nil {
        Println("read file error: ", err)
    }
    defer file.Close()

    buf := make([]byte, length)
    content := []byte{}
    for {
        _, err := file.Read(buf)
        if err == io.EOF {
            break
        }
        content = append(content, buf...)
    }
    return string(content)
}

文件写入分两种: 覆盖写入, 追加写入 文件写入函数本质是对 os.OpenFile 的封装

func write(fileName, s string) {                                     // 文件覆盖写入, 文件不存在则自动新建
    if err := os.WriteFile(fileName, []byte(s), 0666); err != nil {  // WriteFile 是对 OpenFile 的封装
        panic(Sprintf("write error: %v\n", err))
    }
}

func writeInit(fileName, s string) {                                 // 覆盖写入文件, 文件不存在则创建
    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
    if err != nil {
        panic(Sprintln("open file failed"))
    }
    defer file.Close()

    if _, err := file.Write([]byte(s)); err != nil {                 // 也可用 file.WriteString(s), 本质也是调用 file.Write()
        panic(Sprintf("write file failed: %v\n", err))
    }
}

func writeAdd(fileName, s string) {                                  // 追加写入文件, 文件不存在则创建
    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
    if err != nil {
        panic(Sprintln("open file failed"))
    }
    defer file.Close()

    if _, err := file.Write([]byte(s)); err != nil {
        panic(Sprintf("write file failed: %v\n", err))
    }
}
modelmean
O_RDONLY文件打开模式, 只能选 3 选 1, read only 缩写, 只读
O_WRONLY文件打开模式, 只能选 3 选 1, write only 缩写, 只写
O_RDWR文件打开模式, 只能选 3 选 1, read write 缩写, 读写
O_APPEND文件操作模式, 可多选搭配, append, 追加写入
O_TRUNC文件操作模式, 可多选搭配, truncate 缩写, 打开文件时清空文件
O_CREATE文件操作模式, 可多选搭配, create, 文件不存在则创建
O_EXCL文件操作模式, 可多选搭配, exclusive 缩写, 和 O_CREATE 模式一起使用, 文件必须不存在